package com.leslie.hhcommunity.service.impl;

import com.leslie.hhcommunity.dao.DiscussPostMapper;
import com.leslie.hhcommunity.dao.UserMapper;
import com.leslie.hhcommunity.entity.DiscussPost;
import com.leslie.hhcommunity.entity.User;
import com.leslie.hhcommunity.util.CommunityUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;

import java.util.Date;

/**
 * @author
 * @PackageName:com.leslie.hhcommunity.service.impl
 * @ClassnName:AlphaService
 * @Description:
 * @Date 2022/1/3  22:22
 */
@Service
public class AlphaService {

	@Autowired
	private UserMapper userMapper;
	@Autowired
	DiscussPostMapper discussPostMapper;

	private static final Logger logger = LoggerFactory.getLogger(AlphaService.class);


	// REQUIRED: 支持当前事务(外部事务),如果不存在则创建新事务.
	// REQUIRES_NEW: 创建一个新事务,并且暂停当前事务(外部事务).
	// NESTED: 如果当前存在事务(外部事务),则嵌套在该事务中执行(独立的提交和回滚),否则就会REQUIRED一样.
	@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
	public Object save1() {
		// 新增用户
		User user = new User();
		user.setUsername("alpha");
		user.setSalt(CommunityUtil.generateUUID().substring(0, 5));
		user.setPassword(CommunityUtil.md5("123" + user.getSalt()));
		user.setEmail("alpha@qq.com");
		user.setHeaderUrl("http://image.nowcoder.com/head/99t.png");
		user.setCreateTime(new Date());
		userMapper.insertUser(user);

		// 新增帖子
		DiscussPost post = new DiscussPost();
		post.setUserId(user.getId());
		post.setTitle("Hello");
		post.setContent("新人报道!");
		post.setCreateTime(new Date());
		discussPostMapper.insertDiscussPost(post);

		Integer.valueOf("abc");

		return "ok";
	}

	@Autowired
	private TransactionTemplate transactionTemplate;

	//编程式事务
	public Object save2() {

		transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
		transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

		return transactionTemplate.execute(new TransactionCallback<Object>() {
			@Override
			public Object doInTransaction(TransactionStatus status) {
				// 新增用户
				User user = new User();
				user.setUsername("beta");
				user.setSalt(CommunityUtil.generateUUID().substring(0, 5));
				user.setPassword(CommunityUtil.md5("123" + user.getSalt()));
				user.setEmail("beta@qq.com");
				user.setHeaderUrl("http://image.nowcoder.com/head/999t.png");
				user.setCreateTime(new Date());
				userMapper.insertUser(user);

				// 新增帖子
				DiscussPost post = new DiscussPost();
				post.setUserId(user.getId());
				post.setTitle("你好");
				post.setContent("我是新人!");
				post.setCreateTime(new Date());
				discussPostMapper.insertDiscussPost(post);
				//模拟异常
				Integer.valueOf("abc");
				return "ok";
			}
		});
	}

	// 让该方法在多线程环境下,被异步的调用.
	@Async
	public void execute1() {
		logger.debug("execute1");
	}

//	@Scheduled(initialDelay = 10000, fixedRate = 1000)
	public void execute2() {
		logger.debug("execute2");
	}

}
